
本篇文章請至Opshell's Blog服用,已擁有完整的賞文體驗。
當初會選 VitePress 的原因就是他對 .md 的擴充非常的讚,VitePress 使用 markdown-it 做為解析器, VitePress 很多的 .md 的擴展功能都是透過自訂套件實現的,可以在 config 中設定 markdown 選項來調整外掛的行為或添加更多的套件。
今天我們就來設定一下我們需要的 Markdown 功能吧:
export default defineConfig({
    markdown: {
        theme: 'one-dark-pro',
        lineNumbers: true,
        container: {
            infoLabel: '細節:',
            tipLabel: '💡 錦囊 [Tips]:',
            warningLabel: '⚡ 注意 [Warning]:',
            dangerLabel: '⛔ 錯誤 [Error]:',
            detailsLabel: '詳細資料 [Details]:'
        }
    }
});
除了設定shiki的主題樣式,開啟程式區塊的行號以外,還調整了 container 的預設標題,什麼是 container ?

而 container 有上面五種,除了樣式不一樣,行為也是有些差異,詳細的表現可以到這邊看看喔~
前面也說了,設定只是預設標題,意思就是說我們可以自訂標題:

我們的 docs/.vitepress/theme/scss/_vitepress.scss 專門拿來蓋 VitePress 的預設樣式的,所以我們在裡面新增:
.custom-block {
    &.info { // 資訊框
        background-color: var(--vp-c-indigo-soft);
        border: 1px solid var(--vp-c-indigo-3);
    }
    &.tip { // 提示框
        border-left: 3px solid var(--vp-c-brand-3);
    }
    &.warning { // 警告框
        border: 1px solid var(--vp-c-yellow-3);
    }
    &.danger { // 危險框
        border-right: 3px solid var(--vp-c-danger-3);
        border-left: 3px solid var(--vp-c-danger-3);
    }
    &.details {}
}
隨著我們使用 .md 越來越多,然後剛好 Opshell 又是一個龜毛的人,會想調整很多細節部份的樣式,但是 Markdown 渲染出來的 html dom 沒辦法自訂 class 阿 ,該怎麼辦呢~?
在 VitePress 中,有幫我們整合了 markdown-it-attrs 我們設定一下就可以用囉
export default defineConfig({
    markdown: {
        theme: 'one-dark-pro',
        lineNumbers: true,
        container: {
            infoLabel: '細節:',
            tipLabel: '💡 錦囊 [Tips]:',
            warningLabel: '⚡ 注意 [Warning]:',
            dangerLabel: '⛔ 錯誤 [Error]:',
            detailsLabel: '詳細資料 [Details]:'
        },
        attrs: { // [!code ++]
            leftDelimiter: '{', // [!code ++]
            rightDelimiter: '}', // [!code ++]
            allowedAttributes: [] // empty array = all attributes are allowed  // [!code ++]
        } // [!code ++]
    }
});
在 docs/.vitepress/theme/scss/ 中新增 _basic.scss 來當作我們的全域 CSS 設定,記得在 style.scss 中引用喔:
// md attr 樣式
.vp-doc {
    .brand { color: var(--vp-c-brand-1) !important; }
    .error { color: var(--vp-c-red-1) !important; }
    .warning { color: var(--vp-c-yellow-1) !important; }
    .success { color: var(--vp-c-green-2) !important; }
}
// 專案主題變數定義
@import 'variable';
// vitepress 預設樣式的覆蓋
@import 'vitepress';
// 自訂全域CSS // [!code ++]
@import 'basic'; // [!code ++]

甚至可以這樣
如果有到 Opshell's Blog逛逛,稍稍為比較兩邊(it幫 和 VitePress) 一樣的內容,VitePress 可以寫的更規範,理論上也會有更好的閱讀體驗 (如果沒有就是因為 Opshell 還沒優化好樣式)
套句名言:他還是個孩子~~~
所以 Opshell 才會選擇用 VitePress 自己蓋部落格,一切盡在不言中。